package com.findyou.headline.dao.impl;

import com.findyou.headline.dao.BaseDao;
import com.findyou.headline.dao.NewsHeadlineDao;
import com.findyou.headline.pojo.NewsHeadline;
import com.findyou.headline.pojo.vo.HeadlineDetailVo;
import com.findyou.headline.pojo.vo.HeadlinePageVo;
import com.findyou.headline.pojo.vo.HeadlineQueryVo;

import java.util.ArrayList;
import java.util.List;


public class NewsHeadlineDaoImpl extends BaseDao implements NewsHeadlineDao {

    @Override
    public List<HeadlinePageVo> findPageList(HeadlineQueryVo headlineQueryVo) {
        List params = new ArrayList();
        String sql = """
                select
                    hid,
                    title,
                    type,
                    page_views pageViews,
                    TIMESTAMPDIFF(HOUR, create_time, now()) pastHours,
                    publisher 
                from 
                     news_headline
                where
                    is_deleted = 0
                """;
        if(headlineQueryVo.getType() != 0 ) {
            sql = sql.concat(" and type = ? "); // 是拼接语法 注意空格
            params.add(headlineQueryVo.getType());
        }
        if(headlineQueryVo.getKeyWords() != null && !headlineQueryVo.getKeyWords().equals("")) {
            sql = sql.concat(" and title like ? ");
            params.add("%" + headlineQueryVo.getKeyWords() + "%");
        }

        sql = sql.concat(" order by pastHours  ASC, page_views  DESC "); // ASC是升序 DESC是降序
        sql = sql.concat(" limit ? , ? "); // 分页查询  返回的值
        params.add((headlineQueryVo.getPageNum() -1) * headlineQueryVo.getPageSize());
        params.add(headlineQueryVo.getPageSize());

        return baseQuery(HeadlinePageVo.class, sql, params.toArray()); // 注意 第三个参数传的是 数组
    }

    @Override
    public int findPageCount(HeadlineQueryVo headlineQueryVo) {
        List params = new ArrayList();
        String sql = """
                select
                   count(1)
                from 
                     news_headline
                where
                    is_deleted = 0
                """;
        if(headlineQueryVo.getType() != 0 ) {
            sql = sql.concat(" and type = ? "); // 是拼接语法 注意空格
            params.add(headlineQueryVo.getType());
        }
        if(headlineQueryVo.getKeyWords() != null && !headlineQueryVo.getKeyWords().equals("")) {
            sql = sql.concat(" and title like ? ");
            params.add("%" + headlineQueryVo.getKeyWords() + "%");
        }
        Long count = baseQueryObject(Long.class, sql, params.toArray());
        return count.intValue();
    }

    @Override
    public int incrPageViews(int hid) {
        String sql = """
                update news_headline set page_views = page_views + 1 where hid = ? 
                """;
        int rows = baseUpdate(sql, hid);
        return rows;
    }

    @Override
    public HeadlineDetailVo findHeadlineDetail(int hid) {
        String sql = """
                select 
                h.hid hid,
                h.title title,
                h.article article,
                h.type type,
                t.tname typeName,
                h.page_views pageViews,
                TIMESTAMPDIFF(HOUR, h.create_time, now()) pastHours,
                h.publisher publisher,
                u.nick_name author
                from
                    news_headline h
                left join 
                        news_type t
                on 
                        h.type = t.tid
                left join 
                        news_user u
                on 
                        h.publisher = u.uid
                where
                h.hid = ?
                """;
        List<HeadlineDetailVo> list = baseQuery(HeadlineDetailVo.class, sql, hid);
        return null != list && list.size() > 0 ? list.get(0) : null;
    }

    @Override
    public void addNewsHeadline(NewsHeadline newsHeadline) {
        String sql = """
                insert into news_headline
                values(DEFAULT, ?, ?, ?, ?, 0, now(), now(), 0)
                """;
        baseUpdate(sql,
                newsHeadline.getTitle(),
                newsHeadline.getArticle(),
                newsHeadline.getType(),
                newsHeadline.getPublisher());
    }

    @Override
    public NewsHeadline findByHid(int hid) {
        String sql = """
                select
                    hid,
                    title,
                    article,
                    type,
                    publisher,
                    page_views pageViews,
                    create_time createTime,
                    update_time updateTime,
                    is_deleted isDeleted
                from 
                    news_headline
                where
                    hid = ?
                """;
        List<NewsHeadline> list = baseQuery(NewsHeadline.class, sql, hid);
        return list != null && list.size() > 0 ? list.get(0) : null;
    }

    @Override
    public void update(NewsHeadline newsHeadline) {
        String sql = """
                update 
                    news_headline
                set
                    title = ?,
                    article = ?,
                    type = ?,
                    update_time = now()
                where
                    hid = ?
                """;

        baseUpdate(sql, newsHeadline.getTitle(),
                        newsHeadline.getArticle(),
                        newsHeadline.getType(),
                        newsHeadline.getHid());
    }

    @Override
    public void removeByHid(int hid) {
        String sql = """
                update news_headline set is_deleted = 1 where hid = ?
                """;
        baseUpdate(sql, hid);
    }
}
